/* @flow */

import { toArray } from '../util/index'

/**
 * 方法定义，并不是调用，参数并不是实参
 * 记住，就是给对象添加属性和方法
 * 给Vue添加静态方法
 * 通过依赖注入，将Vue作为参数传入
 *
 *
 */
export function initUse (Vue: GlobalAPI) {
  // 接受一个函数或对象
  Vue.use = function (plugin: Function | Object) {
    // 这句的意思是如果this._installedPlugins(数组)存在，就让installedPlugins为this._installedPlugins，如果不存在，就让其为空数组[]
    // 连续赋值
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    // 如果installedPlugins(this._installedPlugins)里存在传入的插件名，则将Vue对象返回，意思已有无需再引入
    if (installedPlugins.indexOf(plugin) > -1) {
      return this
    }

    // additional parameters
    const args = toArray(arguments, 1)
    args.unshift(this)
    if (typeof plugin.install === 'function') {
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
      plugin.apply(null, args)
    }
    installedPlugins.push(plugin)
    return this
  }
}
